#ifndef CSPACECHARGE_H
#define CSPACECHARGE_H
#include <gsl/gsl_errno.h>
#include <gsl/gsl_fft_real.h>
#include <gsl/gsl_fft_complex.h>
#include <gsl/gsl_fft_halfcomplex.h>

#include <vector>
using namespace std;
class CBeam;
class CVector3d;
class CSpaceCharge
{
    public:
	CSpaceCharge();
	~CSpaceCharge();
	//下面的函数可能不好实现。CTrackMp里面已经有beam，直接操作。这里就没办法把成员函数的beam当作整个0
	//程序的beam操作。如果用CTrackMp的beam初始化这个地方，可能会出现问题，初始化的是构造函数，但是
	//beam类的入口，不仅仅是构造函数，可能会出现问题。如果不使用beam的话，就要重新写关于rms尺寸、
	//
	void    InputBeam(vector<vector<double> >*,double);
	void    InGrid(int,int,int,double,double,double);
	void    setFreq(double _dFreq);
	void    setCellLength(double _dLCell);
	void    scheff();
	void    formGrid(); 
	void    FieldError();
	void    InputBeam();
	CVector3d*    Interpret(double,double,double);
    private:
	void    EFieldMap();
	void    plim(double*, double* );
	void    Potential();
	void    FFT3D(vector<vector<vector<double> > >*);
	void    IFFT3D(vector<vector<vector<double> > >*);
	void    FFT1D(vector<vector<vector<double> > >*);
	void    IFFT1D(vector<vector<vector<double> > >*);
	vector<vector<vector<double> > >::iterator itervvvdBegin;
	vector<vector<vector<double> > >::iterator itervvvdEnd;
	vector<vector<double> >::iterator itervvdBegin;
	vector<vector<double> >::iterator itervvdEnd;
	vector<double>::iterator itervdBegin;
	vector<double>::iterator itervdEnd;
    public:
	CBeam    *beam;
    private:
        double    xHalf,yHalf,zHalf;
	double    dQ,dI;         //粒子电量和正负，现在考虑质子,dQ没用.dI is average current in one rf period.
	int       nx,ny,nz;
	double    dx,dy,dz;
	double    xbar,ybar,pbar;
	double    dFreq,dWaveLength;
	int       iParticleNumTotal,ng;//nip表示计算相邻几个书团之间的空间电荷力，暂时仅考虑书团内的＝1
	double    dBetaS,dGammaS;
	vector<vector<vector<double> > >compData,vvvdaa,vvvdex,vvvdey,vvvdez;
	vector<double>          vdzm,vdxm,vdym,vdzs,vdys,vdxs;
	vector<vector<double> > vvdBeam;            //beam中束流粒子坐标分布
	vector<vector<double> > *cord;            //beam中束流粒子坐标分布
	CVector3d   *cv;

};
#endif
